#ifndef AC_COMMON_GENERIC_COPY_PTR_T_HPP_
#define AC_COMMON_GENERIC_COPY_PTR_T_HPP_

#include "generic_copy_ptr.hpp"

template <typename T, typename Parms>
GenericCopyPtr<T, Parms>::GenericCopyPtr(const GenericCopyPtr& other)
{
    if (other.ptr_ != 0)
        ptr_ = parms_.clone(other.ptr_);
    else
        ptr_ = 0;
    parms_ = other.parms_;
}

template <typename T, typename Parms>
void GenericCopyPtr<T, Parms>::assign(const T* other_ptr, const Parms& other_parms)
{
    if (other_ptr == 0)
    {
        if (ptr_ != 0) parms_.del(ptr_);
        ptr_ = 0;
    }
    else if (ptr_ == 0)
    {
        ptr_ = parms_.clone(other_ptr);
    }
    else
    {
        parms_.assign(ptr_, other_ptr);
    }
    parms_ = other_parms;
}

template <typename T, typename Parms>
void GenericCopyPtr<T, Parms>::reset(T* other, const Parms& other_parms)
{
    if (ptr_ != 0)
        parms_.del(ptr_);
    ptr_ = other;
    parms_ = other_parms;
}

template <typename T, typename Parms>
GenericCopyPtr<T, Parms>::~GenericCopyPtr()
{
    if (ptr_ != 0)
        parms_.del(ptr_);
}

#define // AC_COMMON_GENERIC_COPY_PTR_T_HPP_
